<?PHP
/**
 * LianPHP图片处理类库
 * 
 * @author 大春 lianwanchun@163.com
 * @version 0.1 
 * @copyright Copyright &copy; 2010 lian wan chun
 */
class Imgage extends LianPhp {

	//上传成功新文件名
	public	$_mNewfile;

	public $_mErrorInfo;

	//是否打开缩略图功能
	public $_mThumb = false;

	//缩略图最大宽度
	public $_mMaxWidth = 92;

	//缩略图最大高度
	public $_mMaxHigh = 92;

	//最大上传文件大小 默认50K
	public $_mMaxSize = 51200;

	/**
	 * 图片上传处理
	 *
	 * @param string 	$file			上传文件句柄
	 * @param array 	$allowTypes		上传类型限制
	 * @return unknown
	 */
	public function upLoadPic($file, $allowTypes){

		//判断参数是否正确
		if (empty($file['name'])){
			$this->_mErrorInfo  =  '请选择你要上传的图片文件！';
			return false;
		}

		//捕获错误代码
		if($file['error'] !==  0){
			switch($file['error']) {
				case 1:
					$this->_mErrorInfo = '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
					break;
				case 2:
					$this->_mErrorInfo = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
					break;
				case 3:
					$this->_mErrorInfo = '文件只有部分被上传';
					break;
				case 4:
					$this->_mErrorInfo = '没有文件被上传';
					break;
				case 6:
					$this->_mErrorInfo = '找不到临时文件夹';
					break;
				case 7:
					$this->_mErrorInfo = '文件写入失败';
					break;
				default:
					$this->_mErrorInfo = '未知上传错误！';
			}
			return false;
		}
		//检查文件大小
	//	if($file['size'] > $this->_mMaxSize){
	//		$this->_mErrorInfo = '上传文件大小不符！';
	//		return false;
	//	}

		//检查文件Mime类型
		if (is_array($allowTypes)){

			if (!in_array(strtolower($file['type']),$allowTypes)){

				$this->_mErrorInfo = '上传文件MIME类型不允许！';
				return false;

			}

		}

		//检查是否合法上传
		if(!is_uploaded_file($file['tmp_name'])){

			$this->_mErrorInfo = '非法上传文件！';
			return false;

		}

		//检查上传路径
		if (!isset($file['uploadpath'])){

			//setDebugLog("图片上传路径参数错误",__LINE__,__FILE__,__METHOD__,__CLASS__);
			$this->_mErrorInfo = (G_DEBUG)?"图片上传路径参数错误<br />内部错误发生在".__FILE__."第".__LINE__."行":"内部错误";
			return false;

		}else{
			if(!is_dir($file['uploadpath'])) {

				//setDebugLog('上传目录'.$file['uploadpath'].'不存在',__LINE__,__FILE__,__METHOD__,__CLASS__);
				$this->_mErrorInfo = (G_DEBUG)?"上传目录".$file['uploadpath']."不存在<br />内部错误发生在".__FILE__."第".__LINE__."行":'内部错误';
				return false;

			}else{
				if(!is_writeable($file['uploadpath'])) {

					//setDebugLog('上传目录'.$file['uploadpath'].'不可写',__LINE__,__FILE__,__METHOD__,__CLASS__);
					$this->_mErrorInfo = (G_DEBUG)?"上传目录".$file['uploadpath']."不可写<br />内部错误发生在".__FILE__."第".__LINE__."行":'内部错误';
					return false;

				}

			}

		}

		//取扩展名
		$fileinfo = pathinfo($file['name']);
		$ext = $fileinfo['extension'];

		//上传新文件名
		$newfile = md5(microtime()."hc");
		$fileName = $newfile.".".$ext;

		//上传临时文件转指定目录
		if(!move_uploaded_file($file['tmp_name'],$file['uploadpath'].$fileName)){

			//setDebugLog('上传失败',__LINE__,__FILE__,__METHOD__,__CLASS__);
			$this->_mErrorInfo = (G_DEBUG)?"上传失败<br />内部错误发生在".__FILE__."第".__LINE__."行":'内部错误';
			return false;

		}

		//是否使用缩略图
		if($this->_mThumb){
			if ($thumbFileName = $this->thumb($file['uploadpath'].$fileName,$ext,$this->_mMaxWidth,$this->_mMaxHigh)){

				$this->_mNewfile = str_replace($file['uploadpath'],"",$thumbFileName);
				@unlink($file['uploadpath'].$fileName);
				return true;

			}else{

				//setDebugLog('缩略图生成失败',__LINE__,__FILE__,__METHOD__,__CLASS__);
				$this->_mErrorInfo = (G_DEBUG)?"缩略图生成失败<br />内部错误发生在".__FILE__."第".__LINE__."行":'内部错误';
				return false;

			}
		}else{

			$this->_mNewfile = $fileName;

		}

		return true;
	}

	/**
	 * 取得图像信息
	 *
	 * @param string $img 图像文件名
	 * @return array 返回图片信息
	 */
	public function getImageInfo($picFile){
		//获取图片信息
		$imageInfo = getimagesize($picFile);
		if( $imageInfo !==  false){
			if(function_exists(image_type_to_extension)){
				$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
			}else{
				$imageType = strtolower(substr($img,strrpos($img,'.')+1));
			}
			$imageSize = filesize($picFile);
			$info = array(
			"width" =>$imageInfo[0],
			"height" =>$imageInfo[1],
			"type" =>$imageType,
			"size" =>$imageSize,
			"mime" =>$imageInfo['mime']
			);
			return $info;
		}else {
			//setDebugLog('获取图片信息失败',__LINE__,__FILE__,__METHOD__,__CLASS__);
			$this->_mErrorInfo = (G_DEBUG)?"获取图片信息失败<br />内部错误发生在".__FILE__."第".__LINE__."行":'内部错误';
			return false;
		}
	}

	/**
	 * 制作缩略图
	 *
	 * @param string $image	原图
	 * @param string $type	图像格式
	 * @param int $maxWidth	宽度
	 * @param int $maxHeight	高度
	 * @param string $filename	缩略图文件名
	 * @param bool $interlace	启用隔行扫描
	 * @param string $suffix	缩略图保存目录
	 * @return string	返回文件名
	 */
	protected function thumb($image,$type = '',$maxWidth = 200,$maxHeight = 50,$filename = '',$interlace = true,$suffix = '_thumb'){
		// 获取原图信息
		$info  = $this->getImageInfo($image);
		if($info  !==  false) {
			$srcWidth  = $info['width'];
			$srcHeight = $info['height'];
			$pathinfo = pathinfo($image);
			$type =  $pathinfo['extension'];
			$type = empty($type)?$info['type']:$type;
			$type = strtolower($type);
			$interlace  =  $interlace? 1:0;
			unset($info);
			$scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
			// 缩略图尺寸
			$width  = (int)($srcWidth*$scale);
			$height = (int)($srcHeight*$scale);
			// 载入原图
			$createFun = 'ImageCreateFrom'.($type == 'jpg'?'jpeg':$type);
			$srcImg     = $createFun($image);
			//创建缩略图
			if($type != 'gif' && function_exists('imagecreatetruecolor'))
				$thumbImg = imagecreatetruecolor($width, $height);
			else
				$thumbImg = imagecreate($width, $height);
			// 复制图片
			if(function_exists("ImageCopyResampled"))
				ImageCopyResampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);
			else
				ImageCopyResized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);

			if('gif' == $type || 'png' == $type) {
				//imagealphablending($thumbImg, false);//取消默认的混色模式
				//imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
				$background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
				imagecolortransparent($thumbImg,$background_color);  //  设置为透明色，若注释掉该行则输出绿色的图
			}
			// 对jpeg图形设置隔行扫描
			if('jpg' == $type || 'jpeg' == $type)   imageinterlace($thumbImg,$interlace);
			//$gray = ImageColorAllocate($thumbImg,255,0,0);
			//ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);
			// 生成图片
			$imageFun = 'image'.($type == 'jpg'?'jpeg':$type);
			$filename  = empty($filename)? substr($image,0,strrpos($image, '.')).$suffix.'.'.$type : $filename;
			$imageFun($thumbImg,$filename);
			ImageDestroy($thumbImg);
			ImageDestroy($srcImg);
			return $filename;
		}
		return false;
	}
}
?>
